package com.yang.designmode.proxy.dynamicProxy.jdkDynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        // 创建目标对象（真实主题），它是 MyInterface 接口的具体实现类
        MyInterface target = new MyInterfaceImpl();

        // 创建一个 InvocationHandler 实例，并将目标对象传入，用于处理代理对象的方法调用
        InvocationHandler handler = new MyInvocationHandler(target);

        // 使用 Proxy.newProxyInstance() 方法创建一个代理对象
        // 参数说明：
        // 1. target.getClass().getClassLoader()：指定类加载器，用来加载动态生成的代理类
        // 2. new Class<?>[] { MyInterface.class }：指定代理类要实现的接口列表，这里只有一个接口 MyInterface
        // 3. handler：指定代理对象的方法调用处理器，即当代理对象的方法被调用时，会转交给这个 handler 来处理
        MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), // 类加载器
                // 要代理的接口 使用new Class<?>[] { MyInterface.class },或target.getClass().getInterfaces(),
                target.getClass().getInterfaces(),
                handler // 方法调用处理器
        );

        // 调用代理对象的方法，实际会被 InvocationHandler 的 invoke 方法拦截并处理
        proxy.doSomething();
    }
}
